package com.ssyan.boot.config;

import com.ssyan.boot.bean.Car;
import com.ssyan.boot.bean.Pet;
import com.ssyan.boot.bean.User;
import com.ssyan.boot.bean.UserImport;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.*;

/**
 * 该类用于替代xml配置文件来配置
 *
 * 1.@Configuration：告诉SpringBoot这是一个配置类
 * 2.@Bean标注在方法上，给容器注册组件，默认单实例
 * 3.配置类本身也是一个组件，而且是一个默认开启Spring代理对象
 *      默认开启代理bean方法：boolean proxyBeanMethods() default true
 *      Full(proxyBeanMethods = true):完全模式：组件有依赖关系，方法调用前获取单实例
 *      Lite(proxyBeanMethods = false):轻量模式：适用于无依赖关系，加速容器启动过程，减少判断
 *      组件依赖
 * 4.@Import({class[]}):
 *      给容器中自动创建指定的多个类型的组件
 *      默认组件名为该类的全类名
 * 5.@Conditional：
 *      条件装配：满足Conditional指定的条件，则进行组件注入
 *      该注解有很多子注解，满足各种不同场景的条件注入
 * 6.@ImportResource:导入原生spring配置文件
 * 7.@EnableConfigurationProperties({class[]}):
 *      开启单个或多个组件类的属性配置功能
 *      再把指定的组件类自动注册到容器中
 *
 */
@EnableConfigurationProperties(Car.class)
@ImportResource("classpath:beans.xml")
@Import({User.class,UserImport.class})
@Configuration(proxyBeanMethods = true)
public class MyConfig {

    //@ConditionalOnBean(name = "usertom")
    @Bean //给容器中添加组件，以 方法名 作为 组件的id，返回类型就是 组件类型，返回的值，就是组件在容器中的实例
    public User user01() {
        User zhangsan = new User("zhangsan", 18);
        //user组件依赖Pet组件
        zhangsan.setPet(userPet());
        return zhangsan;
    }

    //自定义组件名
    @Bean("tom")
    public Pet tomcatPet() {
        return new Pet("tomcat");
    }

    //@Bean("usertom")
    public Pet userPet() {
        return new Pet("tomcatxx");
    }
}
